#ifndef CLIENTE_H_
#define CLIENTE_H_

#define PATH_TEXTURA "textura.bmp"

#include <string>
#include "red_socket.h"
#include "mutex.h"
#include "red_hilodeentrada.h"
#include "Configuraciones.h"
#include "ObservableGtk.h"
#include "Jugador.h"
#include "JuegoClientImp.h"
#include "Mapa.h"
#include "BuzonDeMensajes.h"

using namespace std;
using namespace red::hilos;
using namespace red::sockets;

class JuegoClientImp;

class Cliente : public ObservableGtk
{
public:
	enum e_ESTADO {CONECTADO,ERROR_CONEXION,DESCARGANDO_IMAGEN,IMAGEN_DESCARGADA,DESCARGANDO_MAPA,
					MAPA_DESCARGADO, UNIDO_AL_JUEGO};
private:
	Socket *m_pSocket;
	red::hilos::thread::Mutex m_Mutex;
	red::hilos::HiloDeEntrada* hiloDeEntrada;
	Configuraciones configuracionesDelJuego;
	BuzonDeMensajes mensajesDeChat;
	BuzonDeMensajes mensajesDeExcepcion;
	BuzonDeMensajes mensajesDeSolicitud;
	BuzonDeMensajes updatesDeDados;
	BuzonDeMensajes mensajesDeFinalizacion;
	JuegoClientImp* juego;
	Mapa* mapa;
	Jugador* jugador;
	string nombreJugador;
	string colorJugador;
	e_ESTADO estado;
public:
	Cliente();
	
	void conectar(string host, string puerto);
	e_ESTADO getEstado() {
		e_ESTADO e;
		m_Mutex.lock();
		e = this->estado;
		m_Mutex.unlock();
		return e;
	}
	void setEstado(e_ESTADO estado) {
		m_Mutex.lock();
		this->estado = estado;
		m_Mutex.unlock();
	}
	JuegoClientImp* getJuego();
	Jugador* getJugador();
	Mapa* getMapa();
	BuzonDeMensajes* getBuzonDeMensajesDeChat();
	BuzonDeMensajes* getBuzonDeMensajesDeExcepcion();
	BuzonDeMensajes* getBuzonDeMensajesDeSolicitud();
	BuzonDeMensajes* getBuzonDeMensajesMostrarDados();
	BuzonDeMensajes* getBuzonDeMensajesDeFinalizacion();
	void unirseAlJuego(string nombreJugador, string colorJugador);
	void enviarMensaje(string mensaje);
	void enviarMensajeChat(string mensaje);
	void escucharMensajes();
	void setConfiguracionesDelJuego(Configuraciones& configuraciones);
	void setBajandoImagen();
	void setBajandoMapa();
	void setMapaDescargado();
	void setUnidoAlJuego();
	void setTextura(string textura);
	Configuraciones* getConfiguracionesDelJuego();
	void desconectar();
	void join();
	virtual ~Cliente();
};

#endif /*CLIENTE_H_*/
